import os
import shutil
from pathlib import Path


def flatten_to_nested_directories(source_dir, target_base_dir, path_separator='__'):
    """
    将按路径命名的文件夹内容合并到对应的实际路径中

    参数:
    source_dir: 包含路径命名文件夹的源目录
    target_base_dir: 目标基础目录，合并后的文件将放在这里
    path_separator: 路径分隔符的替代字符（默认是下划线_）
    """
    source_path = Path(source_dir)
    target_base_path = Path(target_base_dir)

    # 创建目标基础目录
    target_base_path.mkdir(parents=True, exist_ok=True)

    print(f"开始从 {source_dir} 合并到 {target_base_dir}")

    # 遍历源目录中的所有项
    for item in source_path.iterdir():
        # 将文件夹名中的分隔符替换为实际路径分隔符
        # 例如：C_Users_JimmyMo_AppData_Local_pip -> C/Users/JimmyMo/AppData/Local/pip
        relative_path_str = str(item.name).replace(path_separator, os.sep)
        target_path = target_base_path / relative_path_str

        print(f"处理: {item.name} -> {target_path}")
        if item.is_dir():
            # 创建目标路径
            target_path.mkdir(parents=True, exist_ok=True)
            # 移动源文件夹内容到目标路径
            move_folder_contents(item, target_path)
        else:
            # 确保路径存在
            Path(os.path.dirname(target_path)).mkdir(parents=True, exist_ok=True)
            # 移动文件至目标路径
            shutil.move(item, target_path)
            print(f"  复制: {target_path}")

    print("合并完成！")


def move_folder_contents(source_folder, target_folder):
    """
    复制文件夹内容到目标文件夹[1,3](@ref)
    """
    for item in source_folder.rglob('*'):
        if item.is_file():
            # 计算相对路径
            relative_path = item.relative_to(source_folder)
            target_file_path = target_folder / relative_path

            # 创建目标文件的父目录
            target_file_path.parent.mkdir(parents=True, exist_ok=True)

            try:
                # 复制文件[1](@ref)
                # shutil.copy2(item, target_file_path)
                shutil.move(item, target_file_path)
                print(f"  复制: {relative_path}")
            except Exception as e:
                print(f"  错误复制 {item}: {e}")


def preview_merge(source_dir, path_separator='_'):
    """
    预览合并操作，显示每个文件夹将如何被映射
    """
    source_path = Path(source_dir)

    print("预览合并操作：")
    print("-" * 50)

    for item in source_path.iterdir():
        if item.is_dir():
            relative_path_str = str(item.name).replace(path_separator, os.sep)
            print(f"{item.name} -> {relative_path_str}")


# 使用示例
if __name__ == "__main__":
    # 配置参数
    source_directory = r"E:\projects_collector\appstate\pip_unzip"  # 包含路径命名文件夹的目录
    target_directory = r"E:\projects_collector\appstate\pip_merge"  # 目标根目录

    # 先预览
    print("=== 预览 ===")
    preview_merge(source_directory)

    print("\n=== 开始合并 ===")
    # 执行合并
    flatten_to_nested_directories(source_directory, target_directory)